package com.dh.leetcode.nine;

import org.junit.Assert;
import org.junit.Test;

import java.util.*;

/**
 * ClassName: _989_add_to_array_form_of_integer
 * @Description: 989. 数组形式的整数加法
 * 对于非负整数 X 而言，X 的数组形式是每位数字按从左到右的顺序形成的数组。例如，如果 X = 1231，那么其数组形式为 [1,2,3,1]。
 *
 * 给定非负整数 X 的数组形式 A，返回整数 X+K 的数组形式。
 *
 *
 *
 * 示例 1：
 *
 * 输入：A = [1,2,0,0], K = 34
 * 输出：[1,2,3,4]
 * 解释：1200 + 34 = 1234
 * 示例 2：
 *
 * 输入：A = [2,7,4], K = 181
 * 输出：[4,5,5]
 * 解释：274 + 181 = 455
 * 示例 3：
 *
 * 输入：A = [2,1,5], K = 806
 * 输出：[1,0,2,1]
 * 解释：215 + 806 = 1021
 * 示例 4：
 *
 * 输入：A = [9,9,9,9,9,9,9,9,9,9], K = 1
 * 输出：[1,0,0,0,0,0,0,0,0,0,0]
 * 解释：9999999999 + 1 = 10000000000
 *
 * https://leetcode-cn.com/problems/add-to-array-form-of-integer/
 *
 * @author shouzimu
 * @date 2021/1/23 09:14
 */
public class _989_add_to_array_form_of_integer {

    /**
     * 提交记录
     * 第一次使用list.add(0,value) 45ms
     * 第二次使用list.add(value)再反转6ms
     *
     * 可见list.add(0,value)复杂度更高
     *
     * @param A
     * @param K
     * @return
     */
    public List<Integer> addToArrayForm(int[] A, int K) {
        char[] ka = String.valueOf(K).toCharArray();
        List<Integer> res = new ArrayList<>();
        int al = A.length - 1;
        int kl = ka.length - 1;
        int jw = 0;
        while (al >= 0 && kl >= 0) {
            int sum = A[al] + (ka[kl] - '0') + jw;
            res.add(sum % 10);
            jw = sum / 10;
            al--;
            kl--;
        }
        while (al >= 0) {
            int sum = A[al] + jw;
            res.add(sum % 10);
            jw = sum / 10;
            al--;
        }
        while (kl >= 0) {
            int sum = (ka[kl] - '0') + jw;
            res.add(sum % 10);
            jw = sum / 10;
            kl--;
        }
        if (jw > 0) {
            res.add(jw);
        }
        Collections.reverse(res);
        return res;
    }

    @Test
    public void addToArrayFormTest() {
        Assert.assertEquals(Arrays.deepToString(new Integer[]{4, 5, 5}),
                Arrays.deepToString(addToArrayForm(new int[]{2, 7, 4}, 181).toArray()));
        Assert.assertEquals(Arrays.deepToString(new Integer[]{1, 2, 3, 4}),
                Arrays.deepToString(addToArrayForm(new int[]{1, 2, 0, 0}, 34).toArray()));

        Assert.assertEquals(Arrays.deepToString(new Integer[]{1, 0, 2, 1}),
                Arrays.deepToString(addToArrayForm(new int[]{2, 1, 5}, 806).toArray()));

    }
}
